package ink.fujisann.learning.kotlin

import com.alibaba.fastjson.JSON
import com.aliyun.oss.HttpMethod
import lombok.SneakyThrows
import okhttp3.OkHttpClient
import okhttp3.Request
import org.apache.http.conn.ssl.AllowAllHostnameVerifier
import org.apache.http.conn.ssl.NoopHostnameVerifier
import org.json.JSONObject
import org.junit.Test

import java.text.SimpleDateFormat

import java.text.DateFormat
import java.util.*
import com.aliyun.oss.common.utils.DateUtil.formatRfc822Date
import java.time.LocalDateTime
import kotlin.math.log
import com.aliyun.oss.model.OSSObject

import java.util.HashMap

import com.aliyun.oss.model.GeneratePresignedUrlRequest

import com.aliyun.oss.OSS
import com.aliyun.oss.OSSClientBuilder
import com.aliyun.oss.common.utils.DateUtil
import java.net.URL


class TestOkHttp {

    @Test
    fun test1() {
        println("xx")
        val content = "1";
        val okHttpClient = OkHttpClient().newBuilder()
                .hostnameVerifier(NoopHostnameVerifier())
                .build()
        val url = "https://106.13.175.57:444//learning/hello/ossToken?s=$content"
        val request = Request.Builder()
                .url(url).build()
        val call = okHttpClient.newCall(request)
        val response = call.execute()
        val token = response.body()?.string()
        println(token)
    }

    @Test
    fun test2() {
        println(currentFixedSkewedTimeInRFC822Format())

        val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
        val format = simpleDateFormat.format(Date())
        println(format)
    }

    @Test
    fun test3() {
        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        val endpoint = "https://oss-cn-beijing.aliyuncs.com"
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        val accessKeyId = "LTAI4Fjf6Mx8xNtfvXZFWSkj"
        val accessKeySecret = "EpAdrsf7RBsIZzIxsE8zJzRQzkzKlV"
        // 填写Bucket名称。
        // 填写Bucket名称。
        val bucketName = "fujisann-ink-blog"
        // 填写不包含Bucket名称在内的Object完整路径。
        // 填写不包含Bucket名称在内的Object完整路径。
        val objectName = "1.jpeg"

        // 创建OSSClient实例。

        // 创建OSSClient实例。
        val ossClient: OSS = OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret)

        // 填写签名URL的过期时间。

        // 填写签名URL的过期时间。
        val expiration: Date = DateUtil.parseRfc822Date("Wed, 18 Mar 2022 14:20:00 GMT")
        // 生成签名URL。
        // 生成签名URL。
        val request = GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET)
        // 设置过期时间。
        // 设置过期时间。
        request.expiration = expiration
        // 通过HTTP GET请求生成签名URL。
        // 通过HTTP GET请求生成签名URL。
        val signedUrl: URL = ossClient.generatePresignedUrl(request)
        println("signed url for getObject: $signedUrl")

        // 使用签名URL发送请求。

        // 使用签名URL发送请求。
        val customHeaders: MutableMap<String, String> = HashMap()
        // 添加GetObject请求头。
        // 添加GetObject请求头。
        customHeaders["Range"] = "bytes=100-1000"
        val `object` = ossClient.getObject(signedUrl, customHeaders)

        // 关闭OSSClient。

        // 关闭OSSClient。
        ossClient.shutdown()
    }

    private val RFC822_DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss 'GMT'"

    private fun getRfc822DateFormat(): DateFormat? {
        val rfc822DateFormat = SimpleDateFormat(RFC822_DATE_FORMAT, Locale.US)
        rfc822DateFormat.timeZone = SimpleTimeZone(8 * 60 * 60 * 1000, "GMT")
        return rfc822DateFormat
    }

    private fun formatRfc822Date(date: Date?): String? {
        return getRfc822DateFormat()!!.format(date)
    }

    @Synchronized
    private fun currentFixedSkewedTimeInRFC822Format(): String? {
        val date = Date(System.currentTimeMillis())
        println(date)
        return formatRfc822Date(date)
    }
}